package client.services;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;

import server.services.IServicesServeur;
import server.services.channels.IChannel;
import client.ihm.ClientSessionActuelleIHM;

/**
 * Internals client services
 * */
public class Client extends UnicastRemoteObject implements IServicesClient {
	
	private IServicesServeur server;
	private String portServer;
	private String adressServer;
	private String pseudo;
	private String channel;
	private IChannel iChannel;
	private IServicesClient client;
	List<String[]> listeServer;
	  	
	/**
	 * Permet d'obtenir le client
	 * @return le client
	 */
	public IServicesClient getClient() {
		return client;
	}

	/**
	 * Permet d'obtenir le serveur du client
	 * @return le serveur du client
	 */
	public IServicesServeur getServer() {
		return server;
	}

	/**
	 * Permet d'obtenir le port du serveur du client
	 * @return le port du serveur du client
	 */
	public String getPortServer() {
		return portServer;
	}
	
	/**
	 * Permet d'obtenir l'adresse du serveur du client
	 * @return l'adresse du serveur du client
	 */
	public String getAdressServer() {
		return adressServer;
	}
	
	/**
	 * Permet d'obtenir la liste des serveurs disponibles
	 * @return la liste des serveurs disponibles
	 */
	public List<String[]> getListeServer(){
		return listeServer;
	}

	/**
	 * Permet d'obtenir le pseudo du client
	 * @return le pseudo du client
	 */
	public String getPseudo() {
		return pseudo;
	}

	/**
	 * Permet d'obtenir le channel sur lequel est connecte le client
	 * @return le nom du channel ou le client est connecte
	 */
	public String getChannel() {
		return channel;
	}

	/**
	 * Permet d'obtenir le channel sur lequel est connecte le client
	 * @return le channel ou le client est connecte
	 */
	public IChannel getIChannel() {
		return iChannel;
	}
	
	private static final long serialVersionUID = 1L;

	public Client() throws RemoteException {
		super();
	}
	
	/**
	 * Permet d'afficher le message a l'utilisateur
	 * @param message contenu du message a afficher
	 */
	@Override
	public void display(String message) throws RemoteException{
		if(message.equals("update")){
			ClientSessionActuelleIHM clientSession = ClientSessionActuelleIHM.getInstance(this);
			clientSession.updateClients();
		}else if (!message.equals("")){
			System.out.println("Je suis sur le port "+portServer);
			ClientSessionActuelleIHM.getInstance(null).setTaChatClient(message);
		}
	}
	
	/**
	 * Permet la connexion du client au serveur
	 * @param port port du serveur
	 * @param adress adresse IP du serveur
	 * @param userName pseudo du client
	 * @return
	 * @throws RemoteException
	 * @throws NotBoundException
	 * @throws MalformedURLException
	 */
	public IServicesServeur sessionClient(String port, String adress, String userName)throws RemoteException, NotBoundException, MalformedURLException {
		  pseudo = userName;
		  portServer = port;
		  adressServer = adress;
		  server = (IServicesServeur)Naming.lookup("//"+ adress + ":" + portServer + "/IServicesServeur");
		  if(!server.testPseudo(pseudo)){
			  System.out.println("what?");
			  server=null;
		  }else{
			  listeServer = server.getIpPort();
		  }
		  return server;
	}
	
	/**
	 * Permet la reconnexion a un serveur quand le serveur precedent a crashe
	 * @param port port du serveur
	 * @param adress adresse du serveur
	 * @param userName pseudo du client
	 * @return
	 * @throws RemoteException
	 * @throws NotBoundException
	 * @throws MalformedURLException
	 */
	public IServicesServeur sessionClientbis(String port, String adress, String userName)throws RemoteException, NotBoundException, MalformedURLException {
		  pseudo = userName;
		  portServer = port;
		  adressServer = adress;
		  server = (IServicesServeur)Naming.lookup("//"+ adress + ":" + portServer + "/IServicesServeur");
		  if(server == null)
			  System.out.println("looser session client");
		  listeServer = server.getIpPort();
		  return server;
	}
		 
	/**
	 * Permet d'obtenir tous les channels present sur le serveur
	 * @return la liste des channels
	 */
	public List<String> getChannelsName(){
		List<String> channels = new ArrayList<String>();
		try {
			channels = server.getAllChanelsNames();
		} catch (RemoteException e) {
			e.printStackTrace();
		}	  
		return channels;
	}
	  
	/**
	 * Permet au client de se connecter a un channel
	 * @param channelChoosen nom du channel ou le client veut se connecter
	 * @return le channel en question
	 */
	public IChannel connectChannel(String channelChoosen) {
		try {
			channel = channelChoosen;
			iChannel = server.getChannel(channel);
			
			ClientSessionActuelleIHM clientSession = ClientSessionActuelleIHM.getInstance(this);
			clientSession.setVisible(true);
			iChannel.inscription(this);
			clientSession.updateClients();
			
		} catch (RemoteException e) {
			System.out.println("toto");
			e.printStackTrace();
		}	
		return iChannel;
	}
}
